package taller.integrationLayer.caller;

import java.util.Hashtable;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import taller.dataLayer.managers.AdministradorParametros;
import taller.dataLayer.vo.SolicitudCompraVO;
import taller.excepcion.ParserException;
import taller.util.Constantes;
import taller.xml.parser.SolicitudCompraParser;
import taller.xml.parser.XStreamParser;

import com.thoughtworks.xstream.XStream;

@Stateless
public class EmisorSolicitudCompraBean implements EmisorSolicitudCompra {

	@EJB(beanName="AdministradorParametrosBean")
	private AdministradorParametros adminParam;
	
    public void enviarSolicitudDeCompra(SolicitudCompraVO solicitud) 
    		throws JMSException, ParserException, NamingException {
    	QueueConnection qCon = null;
		QueueSession qSession = null;
		
		//Obtengo la parametrizacion del servicio
		int numeroOdvAsignada =  adminParam.getNumeroOdvAsignada();
		String urlProviderKey = Constantes.COLA_SOL_COMPRA_PROVIDER_URL + "_" + numeroOdvAsignada;
		String urlProvider = adminParam.getParametro(urlProviderKey);
		String queueNameKey =  Constantes.COLA_RECIBIR_SOL_COMPRA + "_" + numeroOdvAsignada;
		String queueName = adminParam.getParametro(queueNameKey);
		
		System.out.println("Enviando solicitud de compra " + solicitud.getNumero() + " a la odv " + numeroOdvAsignada);
		System.out.println("Provider url: " +  urlProvider);
		System.out.println("Queue name: " + queueName);
		
		//Convierto a xml
    	XStreamParser parser = new XStreamParser();
		XStream xs = parser.obtenerXStream();
		
		SolicitudCompraParser solCompraParser = new SolicitudCompraParser(solicitud);
		String xml = xs.toXML(solCompraParser);
		parser.liberarXStream();
		
		System.out.println("solicitud de compra a enviar: ");
		System.out.println(xml);
		
		//Inicializo el contexto
		Hashtable<String, String> props = new Hashtable<String, String>();
		props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		props.put(InitialContext.PROVIDER_URL, urlProvider);
		Context ctx = new InitialContext(props);

		// buscar la Connection Factory en JNDI
		QueueConnectionFactory qfactory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");
		// buscar la Cola en JNDI
		Queue queue = (Queue) ctx.lookup(queueName);

		// crear la connection y la session a partir de la connection
		qCon = qfactory.createQueueConnection();
		qSession = qCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

		// crear un producer para enviar mensajes usando la session
		QueueSender qSender = qSession.createSender(queue);
		// crear un mensaje de tipo text y setearle el contenido
		TextMessage message = qSession.createTextMessage();
		
		message.setText(xml);
		
		// enviar el mensaje
		qSender.send(message);

		//Cerrar conexiones y sesiones
		if (qCon != null) {
			qCon.close();
		}
		
		if (qSession != null) {
			qSession.close();
		}
		
		System.out.println("Solicitud de compra " + solicitud.getNumero() + " enviada correctamente!");
    }
}
